package com.boilermaker.springaoplearning.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Slf4j
public class MyTimeMonitor {

    @Around("@annotation(com.boilermaker.springaoplearning.aspect.TimeMonitor)")
    public Object recordTime(ProceedingJoinPoint pjp) {
        // 前置通知（打印时间戳）
        log.info("目标方法执行前...");
        long begin = System.currentTimeMillis();

        // 目标方法
        Object result;
        try {
            result = pjp.proceed(); // 执行目标方法
        } catch (Throwable e) {
            log.info("目标方法抛出异常..."); // 异常后通知
            throw new RuntimeException(e);
        }

        // 后置通知（打印时间戳，计算耗时）
        log.info("目标方法执行后...");
        long end = System.currentTimeMillis();
        log.info(pjp.getSignature() + "执行耗时：" + (end - begin) + " ms");

        return result;
    }
}
